package cn.lg.soar.core.annotations;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * 缓存注解（仅用于替换 spring@Cacheable，清除缓存请使用 @SoarCacheEvict）
 * 1.支持本地和远程的二级缓存
 * 2.支持指定本地和远程缓存失效时间
 * 3.支持多租户
 * 4.TODO：支持类类型，为序列化节省空间
 * @author luguoxiang
 * @date 2022/6/27
 * 开源项目：https://gitee.com/lgx1992/lg-soar 求star！请给我star！请帮我点个star！
 */
@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface SoarCache {

    /**
     * 缓存名称
     */
    String value();

    /**
     * 缓存key，el表达式
     */
    String key();

    /**
     * 缓存类型
     */
    Type type() default Type.all;

    /**
     * 是否区分租户
     * @return
     */
    boolean enabledTenant() default true;

    /**
     * 本地缓存有效期，单位：秒
     */
    int localExpire() default 0;

    /**
     * 远程缓存有效期，单位：秒
     */
    int remoteExpire() default 0;

    /**
     * 数据类型
     */
    Class<?> dataType() default Object.class;

    enum Type {
        /**
         * 本地缓存
         */
        local,
        /**
         * 远程缓存
         */
        remote,
        /**
         * 二级缓存
         */
        all
    }

}
